/*
分步骤实现函数封装的飞机游戏，并提交至码云git平台

1 代码重构
2 新式子弹
3 静止敌机
4 敌机移动
5 击中敌机
6 更新清屏功能
*/
/*
在前面飞机游戏的基础上继续增加功能，并提交至码云git平台，一个功能25分：
–随着积分的增加，加快敌机的下落速度；
–防止玩家操控飞机飞出边界；
–尝试实现复杂的多字符飞机图形；
–增加按ESC键后游戏暂停的功能。
•请在答题部分给出码云git项目地址，评阅同学打开该地址查看成绩，并在在线课堂上给出互评成绩
*/

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
int position_x,position_y;//飞机位置
int high,width;//游戏尺寸
int bullet_x,bullet_y;//子弹位置
int enemy_x,enemy_y;//敌机位置
int s,p,l=-1;

void introduction()
{
    printf("wasd移动，空格发射\n敌机触碰到飞机核心时得分归零\n请使用英文输入法");
    system("pause");
}


void gotoxy(int x, int y) //光标移动到（x，y）位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void HideCursor()//屏蔽光标
{
	CONSOLE_CURSOR_INFO cursor_info = { 1.0 };//第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}



void startup()//数据初始化
{
    high = 20;
    width = 35;

    position_x = high/2;
    position_y = width/2;

    bullet_x = -1;
    bullet_y = position_y;

    enemy_x = 0;
    enemy_y = width/2;

    HideCursor();
}

void show()//画面显示
{
    gotoxy(0,0);//清屏
    int i,j;
    for(i=0;i<high;i++)
        {
            for(j=0;j<width;j++)
                {
                    if(i==position_x&&j==position_y)
                        printf("-|+|-");           //输出飞机
                    else if(i==bullet_x&&j==bullet_y+2)
                        printf("|");               //输出子弹
                    else if(i==enemy_x&&j==enemy_y+2)
                        printf("*");               //输出敌机
                    else
                        printf(" ");
                }
            printf("\n");
        }
        printf("得分:%d",s);

}

void updatewithoutinput()                     //与用户更新无关的输入
{
     if((bullet_x==enemy_x)&&(bullet_y==enemy_y))
        {
            s++;
            enemy_x=0;
            enemy_y=rand()%30;
            bullet_x=-1;
        }


    static int speed = 0;//控制飞机下落速度
    if(speed<10)
    speed++;

     if(bullet_x>-1)   //生成子弹
      bullet_x--;

        if(enemy_x>high)   //生成敌机
        {
            enemy_x=0;
            enemy_y=rand()%30;
        }
        else
        {
            if(speed==10)
            {
                enemy_x++;
                speed=0;
            }
        }
    if((enemy_x==position_x&&enemy_y==position_y))
        s=0;

}

void updatewithinput()//与用户更新有关的输入
{
    char input;
    if(kbhit())//按键执行
    {
    input=getch();

    if(input=='a')
        position_y--;
    if((input=='d')&&(position_y<width-2))
        position_y++;
    if(input=='w')
        position_x--;
    if((input=='s')&&(position_x<high-1))
        position_x++;
    if(input==' ')
        bullet_x = position_x-1;
        bullet_y = position_y;
    if(input==27)
       {
         system("pause");
       }

    }

}


int main()
{
    introduction();//用户说明
    startup();//数据初始化
    while(1)//游戏循环执行
    {
        show();//画面显示
        updatewithoutinput();//与用户更新无关的输入
        updatewithinput();//与用户更新有关的输入
    }

    return 0;
}

